GETPWNAM(3) | Linux Programmer's Manual | GETPWNAM(3) |
名前¶
getpwnam, getpwnam_r, getpwuid, getpwuid_r - パスワードファイルのエントリの取得
書式¶
#include <sys/types.h> #include <pwd.h> struct passwd *getpwnam(const char *name); struct passwd *getpwuid(uid_t uid); int getpwnam_r(const char *name, struct passwd *pwd,
char *buf, size_t buflen, struct passwd **result); int getpwuid_r(uid_t uid, struct passwd *pwd,
char *buf, size_t buflen, struct passwd **result);
glibc
向けの機能検査マクロの要件
(feature_test_macros(7) 参照):
getpwnam_r(), getpwuid_r(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE || _POSIX_SOURCE
説明¶
getpwnam() 関数は、ユーザ名 name にマッチするパスワード・データベースのエントリを 要素毎に分解し、各要素を格納した構造体へのポインタを返す (パスワード・データベースの例: ローカルのパスワードファイル /etc/passwd, NIS, LDAP)。
getpwuid() 関数は、ユーザ ID uid にマッチするパスワード・データベースのエントリを 要素毎に分解し、各要素を格納した構造体へのポインタを返す。
getpwnam_r() と getpwuid_r() 関数は (上記の関数と) 同じ情報を取得するが、 取得した passwd 構造体を pwd が指す領域に格納する。 この passwd 構造体には文字列へのポインタが含まれ、 これらの文字列はサイズ buflen のバッファ buf に格納される。 成功した場合 *result には結果へのポインタが格納される。 エントリが見つからなかった場合やエラーが発生した場合には *result には NULL が入る。
passwd 構造体は、<pwd.h> で以下のように定義されている:
struct passwd {
char *pw_name; /* ユーザ名 */
char *pw_passwd; /* ユーザのパスワード */
uid_t pw_uid; /* ユーザ ID */
gid_t pw_gid; /* グループ ID */
char *pw_gecos; /* 実名 */
char *pw_dir; /* ホームディレクトリ */
char *pw_shell; /* シェルプログラム */ };
buf に最大必要なサイズは、 sysconf(3) に引き数 _SC_GETPW_R_SIZE_MAX を指定して実行することで分かる。
返り値¶
getpwnam() と getpwuid() 関数は、 passwd 構造体へのポインタを返す。 一致するエントリが見つからなかった場合や、エラーが発生した場合は NULL を返す。 エラーが起こった場合、 errno が適切に設定される。 呼び出しの後で errno をチェックしたい場合は、 呼び出しの前に (この値を) 0 に設定しておくべきである。
返り値は静的な領域を指しており、その後の getpwent(3), getpwnam(), getpwuid() の呼び出しで上書きされるかもしれない。 (返されたポインタを free(3) に渡さないこと。)
成功すると、 getpwnam_r() と getpwuid_r() は 0 を返し、 *result に pwd を設定する。 マッチするパスワード・エントリが見つからなかった場合には、 0 を返し、 *result に NULL を設定する。 エラーの場合、エラー番号を返し、 *result に NULL を設定する。
エラー¶
ファイル¶
- /etc/passwd
- ローカルのパスワード・データベースファイル
準拠¶
SVr4, 4.3BSD, POSIX.1-2001.
注意¶
上記の「返り値」以下の記述は POSIX.1-2001 に拠る。 この標準は「(エントリが) 見つからないこと」をエラーとしていないので、 そのような場合に errno がどのような値になるかを定めていない。 そのため、エラーを認識することは不可能である。 POSIX に準拠して、エントリが見つからない場合は errno を変更しないようにすべきである、と主張する人もいるかもしれない。 様々な Unix 系のシステムで試してみると、そのような場合には 0, ENOENT, EBADF, ESRCH, EWOULDBLOCK, EPERM といった様々な値が返される。 他の値が返されるかもしれない。
フィールド pw_dir には、ユーザの作業ディレクトリ名の初期値が格納される。 ログインプロセスは、このフィールドの値を使って、 ログインシェルの HOME 環境変数を初期化する。 アプリケーションが、ユーザのホーム・ディレクトリを決定する場合には、 (getpwuid(getuid())->pw_dir の値ではなく) HOME の値を検査するようにすべきである。 なぜなら、このようにすることで、ユーザがログイン・セッション中で 「ホーム・ディレクトリ」の意味を変更できるようになるからである。 別のユーザのホーム・ディレクトリ (の初期値) を知るには getpwnam("username")->pw_dir か同様の方法を使う必要がある。
例¶
以下のプログラムは getpwnam_r() の使用例を示したもので、コマンドライン引き数で渡されたユーザ名に対する 完全なユーザ名とユーザ ID を探すものである。
#include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> int main(int argc, char *argv[]) {
struct passwd pwd;
struct passwd *result;
char *buf;
size_t bufsize;
int s;
if (argc != 2) {
fprintf(stderr, "Usage: %s username\n", argv[0]);
exit(EXIT_FAILURE);
}
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
if (bufsize == -1) /* 値を決定できなかった */
bufsize = 16384; /* 十分大きな値にすべき */
buf = malloc(bufsize);
if (buf == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
s = getpwnam_r(argv[1], &pwd, buf, bufsize, &result);
if (result == NULL) {
if (s == 0)
printf("Not found\n");
else {
errno = s;
perror("getpwnam_r");
}
exit(EXIT_FAILURE);
}
printf("Name: %s; UID: %ld0, pwd.pw_gecos, (long) pwd.pw_uid);
exit(EXIT_SUCCESS); }
関連項目¶
endpwent(3), fgetpwent(3), getgrnam(3), getpw(3), getpwent(3), getspnam(3), putpwent(3), setpwent(3), passwd(5)
2009-03-30 | GNU |